/* 
 * GrayRabbit Cms基于J2EE架构内容管理系统
 * Copyright © GrayRabbit Co., Ltd. All rights reserved.
 * Department：运营部
 * 更多信息请访问：
 * http://code.google.com/p/gray-rabbit-cms/
 */
package org.grayrabbit.cms.dao.search.impl;

import java.util.List;

import org.apache.commons.lang.StringUtils;
import org.grayrabbit.cms.dao.search.KeywordsDao;
import org.grayrabbit.cms.entity.Keywords;
import org.grayrabbit.cms.vo.search.KeywordsBean;
import org.springframework.stereotype.Repository;

import org.grayrabbit.dao.impl.GenericHibernateDao;
import org.grayrabbit.dao.util.Page;
import org.grayrabbit.dao.util.QueryCondition;

/**
 * <b>Keywords</b> dao implementation 





 * @version 1.0，创建时间：2011-10-26 13:42:09 
 */
@Repository
public class KeywordsDaoImpl extends GenericHibernateDao<Keywords, String>
		implements KeywordsDao {

	/**
	 * HQL主体语句
	 */
	public static final String MAIN_HQL = "From Keywords as obj";
	/**
	 * HQL中count统计hql片段
	 */
	public static final String COUNT_HQL = "Select Count(obj) ";

	/**
	 * 根据bean组装查询条件
	 * @see KeywordsDao#assembly(KeywordsBean)
	 */
	public QueryCondition assembly(KeywordsBean bean) {
		QueryCondition qc = new QueryCondition(MAIN_HQL);
		transNameQuery(bean,qc);
		return qc;
	}

	/**
	 * 根据bean组装统计查询条件
	 * @see KeywordsDao#assemblyCount(KeywordsBean)
	 */
	public QueryCondition assemblyCount(KeywordsBean bean) {
		QueryCondition qc = new QueryCondition(COUNT_HQL + MAIN_HQL);
		transNameQuery(bean,qc);
		return qc;
	}

	/**
	 * @see KeywordsDao#count(KeywordsBean)
	 */
	public int count(KeywordsBean bean) {
		return ((Long)iterator(assemblyCount(bean)).next()).intValue();
	}

	/**
	 * 根据bean组装查询条件(名称参数)
	 * @see KeywordsDao#assemblyNameQuery(KeywordsBean)
	 */
	public QueryCondition assermblyNameQuery(KeywordsBean bean) {
		QueryCondition qc = new QueryCondition(MAIN_HQL);
		transNameQuery(bean, qc);
		return qc;
	}

	/**
	 * 根据bean组装统计查询条件(名称参数)
	 * @see KeywordsDao#assemblyNameQueryCount(KeywordsBean)
	 */
	public QueryCondition assemblyNameQueryCount(KeywordsBean bean) {
		QueryCondition qc = new QueryCondition(COUNT_HQL + MAIN_HQL);
		transNameQuery(bean,qc);
		return qc;
	}

	/**
	 * 填充分页组件
	 * @see KeywordsDao#findByPage(Page, KeywordsBean)
	 */
	public List<Keywords> findByPage(Page<Keywords> page,
			KeywordsBean bean) {
		QueryCondition qc = assembly(bean);
		qc.setMaxResults(page.getPageSize());
		qc.setOffset(page.getOffset());
		return findByQc(qc);
	}
	// 业务查询主要逻辑代码
	private void transNameQuery(KeywordsBean bean,QueryCondition qc){
		if(bean!=null){
			if(StringUtils.isNotBlank(bean.getKeywords())){
				qc.add("And obj.keywords like ? ", bean.getKeywords()+"%");
			}          
            if(bean.getIsEnable() != null){
				qc.add("And obj.isEnable = ? ", bean.getIsEnable());
			}
		}
		if(StringUtils.isNotBlank(bean.getKword())){
			qc.append(" And (");
			qc.add(" obj.keywords like ? ", "%"+bean.getKword()+"%");
			qc.add(" or obj.pinyin like ? ", "%"+bean.getKword()+"%");
			qc.add(" or obj.firstLetter like ? ", "%"+bean.getKword()+"%");
			qc.append(") "); 
		}
		qc.appenOrderBy(" obj.isEnable asc");
	}

	public boolean isExistWords(String id, String word) {
		if(StringUtils.isBlank(word)) 
			return false;
		QueryCondition qc = new QueryCondition(MAIN_HQL);
		qc.add(" And obj.keywords = ? ", word);
		List<Keywords> list = findByQc(qc);
		if(list.isEmpty()) 
			return false;
		if(StringUtils.isBlank(id)) 
			return true;
		Keywords k = list.get(0);
		if(k.getKeywordsId().equals(id)) 
			return false;
		return true;
	}


	public List<Keywords> listEnable(int offset, int maxSize) {
		QueryCondition qc = new QueryCondition(MAIN_HQL);
		qc.add(" And obj.isEnable = ? ", true);
		qc.setOffset(offset);
		qc.setMaxResults(maxSize);
		return findByQc(qc);
	}
	
	public int countEnable(){
		QueryCondition qc = new QueryCondition(COUNT_HQL + MAIN_HQL);
		qc.add(" And obj.isEnable = ? ", true);
		return ((Long)iterator(qc).next()).intValue();
	}

}